<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
        原型是js语言的设计模式基础
        它的主要作用是用于继承让其共享内存减少资源，
        简单来说就是子类可以使用父类的值和方法（原型链）

        原型有个问题就是
        查找原型的属性的性能会比较差，所以一般用for...in的时候性能较差，会把所有原型链上的属性找出来

        那么怎么实现呢？
        js语言有点像个金字塔，金字塔的顶端是
        null->object->所有其它内置对象

        原型属性有两个：

        __proto__是隐式原型（对象就有，一般指向父亲的prototype，即构造器的原型）
        __proto__===constructor.prototype
        prototype是显式原型(构造函数/类才会有)

        __proto__是用来指向父亲的prototype


        */

 

        console.log('')
        // 底层a是个String对象的实例，
        let a='';
        // a的原型链
        // a=>String=>Object=>null
        // a.__proto__=>String.__proto__(String.prototype.__proto__)=>Object.prototype()=>null

        // 因为a是实例，所以它没有prototype属性，只有构造函数才有
        console.log(a.prototype);//undefined
        //如果要找a的prototype，就只能找它的构造函数的prototype

        //a实例的构造函数属性
        console.dir(a.constructor);
        //a实例的构造函数的原型
        console.dir(a.constructor.prototype);
        console.log(String.prototype)//字符串函数的原型
        // a.__proto__===String.prototype===a.constructor.prototype
        console.log(a.__proto__);// 它的父亲
        // a的原型指向它的父亲的原型
        console.log(a.__proto__===String.prototype)//true 
        // a的原型指向它的构造函数的原型
        console.log(a.__proto__===a.constructor.prototype)// true 


        //为什么字面量变量能调用其构造函数方法？
        // 因为js会在执行基本数据代码时会马上创建一个临时对象（简称包装对象）等其使用完之后会销毁
        // console.log(''.indexOf())
        // console.log(new String('').indexOf())
        



    </script>
    

    <script>
        {
            // 如何添加公共函数

            //错误写法，不要直接覆盖类的原型，一般只追加
            Array.prototype={hello:function(){}}
            //正确写法
            Array.prototype.hello=function(){}
        }
        {
            function User(name){
                this.name=name;
            }
            let zhangsan=new User('zhangsan')
            let lisi=new zhangsan.constructor('lisi')
            console.log(lisi)
        }
        
    </script>
</body>
</html>